﻿package fr.babos.core.mvc
{
	import fr.babos.core.data.collect.DataCollection;
	import fr.babos.core.data.collect.IDataCollection;
	import fr.babos.core.data.remote.IDataRemote;
	import fr.babos.core.data.remote.IRemote;
	import fr.babos.core.errors.BabosError;
	import fr.babos.core.mvc.IModel;
	import org.osflash.signals.DeluxeSignal;
	import org.osflash.signals.ISignal;
	
	/**
	 * Le modèle de données de base.
	 * @author ZoulouX
	 */
	public class Model implements IModel
	{
		/**
		 * L'état du model
		 */
		protected var _ready					:Boolean 							= false;
		
		/**
		 * La remote
		 */
		protected var _remote					:IRemote;
		
		/**
		 * Si le model est activé ou non
		 */
		protected var _enabled					:Boolean							= false;
		
		/**
		 * Le signal lorsque c'est prêt
		 */
		protected var _onReady					:DeluxeSignal						= new DeluxeSignal(this);
		
		/**
		 * Le signal lorsqu'un erreur est déclanchée
		 */
		protected var _onError					:DeluxeSignal						= new DeluxeSignal(this);
		
		
		/**
		 * Le signal lorsque c'est prêt
		 */
		public function get onReady ():ISignal 
		{
			return _onReady;
		}
		
		/**
		 * Le signal lorsqu'un erreur est déclanchée
		 */
		public function get onError ():ISignal 
		{
			return _onError;
		}
		
		
		/**
		 * L'état du model
		 */
		public function get ready ():Boolean { return _ready; }
		public function set ready (value:Boolean):void 
		{
			// S'il y a un changement d'état
			if (value != _ready)
			{
				// Enregistrer l'état
				_ready = value;
				
				// Dispatcher si c'est prêt
				if (_ready)
					_onReady.dispatch();
			}
		}
		
		/**
		 * La remote associée
		 */
		public function get remote ():IDataRemote { return _remote; }
		public function set remote (value:IDataRemote):void 
		{
			_remote = value;
		}
		
		/**
		 * Récupérer l'état d'activation du model
		 */
		public function get enabled ():Boolean { return _enabled }
		public function set enabled (value:Boolean):void
		{
			// Vérifier que la valeur soit différente
			if (value != _enabled)
			{
				// Enregistrer la nouvelle valeur
				_enabled = value;
				
				/*
				// Dispatcher l'event
				if (value)
					dispatchEvent(new Event(Event.ACTIVATE));
				else
					dispatchEvent(new Event(Event.DEACTIVATE));
				*/
			}
		}
		
		/**
		 * Le constructeur
		 */
		public function Model ()
		{
			
		}
		
		/**
		 * Initialisation du model.
		 * Méthode abstraite à overrider.
		 */
		public function init ():void
		{
			
		}
		
		/**
		 * Une valeur est injectée par un manager de dépendances
		 * @param	pPropertyName : Le nom de la propriété injectée
		 * @param	pInjectedValue : La valeur injectée
		 */
		public function injected (pPropertyName:String, pInjectedValue:*):void
		{
			
		}
		
		/**
		 * Effacer cet élément.
		 * Méthode abstraite à overrider.
		 */
		public function dispose ():void
		{
			// Missing dispose implementation
		}
	}
}